home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 684 / 684.xpi / chrome / fireftp.jar / content / js / connection / ftpController.js < prev    next >
Text File  |  2009-02-19  |  19KB  |  551 lines

  1. function connect(noAccountChange, showPassDialog) {
  2.   if (!noAccountChange) {
  3.     onAccountChange();
  4.   }
  5.  
  6.   gStatusBarClear = false;
  7.  
  8.   for (var x = 0; x < gMaxCon; ++x) {
  9.     gConnections[x].host = gConnections[x].host.replace(/^ftp:\/*/, '');    // error checking - get rid of 'ftp://'
  10.  
  11.     if (gConnections[x].host && gConnections[x].host.charAt(gConnections[x].host.length - 1) == '/') {
  12.       gConnections[x].host = gConnections[x].host.substring(0, gConnections[x].host.length - 1);
  13.     }
  14.   }
  15.  
  16.   if (gFtp.host == "about:mozilla") {                                       // just for fun
  17.     window.openDialog("chrome://fireftp/content/welcome.xul", "welcome", "chrome,dialog,resizable,centerscreen", "", true);
  18.     gConnectButton.label = "Flame On!";
  19.     gConnectButton.setAttribute('accesskey', "F");
  20.     return;
  21.   }
  22.  
  23.   if (!gFtp.host) {                                                         // need to fill in the host
  24.     doAlert(gStrbundle.getString("alertFillHost"));
  25.     return;
  26.   }
  27.  
  28.   if (!gFtp.port || !parseInt(gFtp.port)) {                                 // need a valid port
  29.     doAlert(gStrbundle.getString("alertFillPort"));
  30.     return;
  31.   }
  32.  
  33.   if (!gFtp.login || !gFtp.password || showPassDialog) {                    // get a password if needed
  34.     var passwordObject       = new Object();
  35.     passwordObject.login     = gFtp.login;
  36.     passwordObject.password  = gFtp.password;
  37.     passwordObject.returnVal = false;
  38.  
  39.     window.openDialog("chrome://fireftp/content/password.xul", "password", "chrome,modal,dialog,resizable,centerscreen", passwordObject);
  40.  
  41.     if (passwordObject.returnVal) {
  42.       for (var x = 0; x < gMaxCon; ++x) {
  43.         gConnections[x].login    = passwordObject.login;
  44.         gConnections[x].password = passwordObject.password;
  45.       }
  46.     } else {
  47.       return;
  48.     }
  49.   }
  50.  
  51.   if (gFtp.security == "sftp" && gPlatform == 'linux') {
  52.     if (!gFtp.getExec().exists()) {
  53.       doAlert(gStrbundle.getString("sftpLinuxNotFound"));
  54.       return;
  55.     }
  56.   }
  57.  
  58.   if (gFtp.security == "sftp" && gPlatform == 'mac') {
  59.     if (!gFtp.getExec().exists()) {
  60.       doAlert(gStrbundle.getString("sftpMacNotFound"));
  61.       return;
  62.     }
  63.   }
  64.  
  65.   if (gFtp.security == "sftp" && gFtp.privatekey) {
  66.     var pk = localFile.init(gFtp.privatekey);
  67.  
  68.     if (!pk || !pk.exists()) {
  69.       doAlert(gStrbundle.getString("pkNotFound"));
  70.       return;
  71.     }
  72.   }
  73.  
  74.   setConnectButton(false);
  75.  
  76.   for (var x = 0; x < gSiteManager.length; ++x) {                           // print out debug info; help me help you
  77.     if (gSiteManager[x].account == gAccount) {
  78.       var debugSite = new cloneObject(gSiteManager[x]);
  79.       debugSite.password = "";
  80.       debug(debugSite.toSource(), "DEBUG");
  81.       break;
  82.     }
  83.   }
  84.  
  85.   debug(  "gConcurrent:"    + gConcurrent
  86.       + ", gMaxCon:"        + gMaxCon
  87.       + ", gRefreshMode:"   + gRefreshMode
  88.       + ", gTempPasvMode:"  + gTempPasvMode
  89.       + ", gLoadUrl:"       + (gLoadUrl ? 'true' : 'false')
  90.       + ", fileMode:"       + gFtp.fileMode
  91.       + ", hiddenMode:"     + gFtp.hiddenMode
  92.       + ", keepAliveMode:"  + gFtp.keepAliveMode
  93.       + ", networkTimeout:" + gFtp.networkTimeout
  94.       + ", proxyHost:"      + gFtp.proxyHost
  95.       + ", proxyPort:"      + gFtp.proxyPort
  96.       + ", proxyType:"      + gFtp.proxyType
  97.       + ", activePortMode:" + gFtp.activePortMode
  98.       + ", activeLow:"      + gFtp.activeLow
  99.       + ", activeHigh:"     + gFtp.activeHigh
  100.       + ", reconnectMode:"  + gFtp.reconnectMode
  101.       + ", sessionsMode:"   + gFtp.sessionsMode
  102.       + ", timestampsMode:" + gFtp.timestampsMode
  103.       + ", useCompression:" + gFtp.useCompression
  104.       + ", integrityMode:"  + gFtp.integrityMode
  105.       + ", userAgent:"      + navigator.userAgent, "DEBUG");
  106.  
  107.   gFtp.connect();
  108. }
  109.  
  110. function disconnect() {
  111.   var working = false;
  112.  
  113.   for (var x = 0; x < gMaxCon; ++x) {
  114.     if (gConnections[x].isConnected && gConnections[x].eventQueue.length && (gConnections[x].eventQueue.length > 1
  115.                                                                          || (gConnections[x].eventQueue[0].cmd != "NOOP" && gConnections[x].eventQueue[0].cmd != "aborted"))) {
  116.       working = true;
  117.       break;
  118.     }
  119.   }
  120.  
  121.   if (working && !confirm(gStrbundle.getString("reallyclose"))) {
  122.     return;
  123.   }
  124.  
  125.   setConnectButton(true);
  126.   gRemotePath.value = '/';
  127.   gRemotePathFocus  = '/';
  128.   document.title    = "FireFTP";
  129.  
  130.   for (var x = 0; x < gMaxCon; ++x) {
  131.     if (gConnections[x].isConnected) {
  132.       gConnections[x].disconnect();
  133.     }
  134.  
  135.     if (gFtp.security == "sftp") {
  136.       gConnections[x].sftpKill();
  137.     }
  138.   }
  139.  
  140.   if (gFxp && gFxp.isConnected) {
  141.     gFxp.disconnect();
  142.   }
  143. }
  144.  
  145. var securityCallbacks = {
  146.   connection : null,
  147.  
  148.   getInterface : function(iid, instance) {
  149.     if (iid.equals(Components.interfaces.nsIBadCertListener2)) {
  150.       return this;
  151.     }
  152.  
  153.     return null;
  154.   },
  155.  
  156.   notifyCertProblem : function(socketInfo, status, targetSite) {
  157.     var self = this;
  158.  
  159.     var func = function() {
  160.       var flags = gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0 +
  161.                   gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_1;
  162.       var response = gPromptService.confirmEx(window, gStrbundle.getString("secureConnFailed"),
  163.                                                      gStrbundle.getFormattedString("usesInvalidCert", [self.connection.host]) + "\n\n"
  164.                                                    + (status.isDomainMismatch     ? gStrbundle.getFormattedString("domainMismatch", [status.serverCert.commonName]) + "\n" : "")
  165.                                                    + (status.isNotValidAtThisTime ? gStrbundle.getString("isNotValidAtThisTime") + "\n" : "")
  166.                                                    + (status.isUntrusted          ? gStrbundle.getString("isUntrusted") + "\n" : "")
  167.                                                    + "\n" + gStrbundle.getString("secureConnFailedDesc"), flags,
  168.                                                      gStrbundle.getString("cancelButton"),
  169.                                                      gStrbundle.getString("orSeeWhatsBehindDoorNumberTwo"),
  170.                                                      null, null, {});
  171.  
  172.       if (response == 0) {
  173.         self.connection.onDisconnect();
  174.         self.connection = null;
  175.         return;
  176.       }
  177.  
  178.       response = gPromptService.confirmEx(window, gStrbundle.getString("secureConnFailed"),
  179.                                                  gStrbundle.getString("addExceptionDesc"), flags,
  180.                                                  gStrbundle.getString("addExceptionEscape"),
  181.                                                  gStrbundle.getString("addException"),
  182.                                                  null, null, {});
  183.  
  184.       if (response == 0) {
  185.         self.connection.onDisconnect();
  186.         self.connection = null;
  187.         return;
  188.       }
  189.  
  190.       var params = { location : targetSite, exceptionAdded : false };
  191.       window.openDialog('chrome://pippki/content/exceptionDialog.xul', '', 'chrome,centerscreen,modal', params);
  192.  
  193.       if (params.exceptionAdded) {
  194.         self.connection.onDisconnect(true);
  195.         self.connection.connect();
  196.       } else {
  197.         self.connection.onDisconnect();
  198.       }
  199.  
  200.       self.connection = null;
  201.     };
  202.  
  203.     setTimeout(func, 0);
  204.  
  205.     return true;
  206.   }
  207. };
  208.  
  209. function securityPopup(secure) {
  210.   $('identity-popup-container').className              = secure ? "verifiedDomain" : "unknownIdentity";
  211.   $('identity-popup-content-box').className            = secure ? "verifiedDomain" : "unknownIdentity";
  212.   $('identity-popup-content').textContent              = secure ? gFtp.host                           : "";
  213.   $('identity-popup-content-supplemental').textContent = secure ? gStrbundle.getString("locVerified") : gStrbundle.getString("idUnknown");
  214.   $('identity-popup-content-verifier').textContent     = secure ? ""                                  : "";
  215.   $('identity-popup-encryption-label').textContent     = secure ? gStrbundle.getString("encrypted")   : gStrbundle.getString("notEncrypted");
  216. }
  217.  
  218. var ftpObserver = {
  219.   extraCallback     : null,
  220.   securityCallbacks : securityCallbacks,
  221.  
  222.   onConnectionRefused : function() {
  223.     displayWelcomeMessage(gFtp.welcomeMessage);
  224.     setConnectButton(true);
  225.   },
  226.  
  227.   onConnected : function() {
  228.     connectedButtonsDisabler();
  229.     setConnectButton(false);
  230.  
  231.     if (gFtp.security) {
  232.       $('remotepath').setAttribute("security", "on");
  233.       securityPopup(true);
  234.     }
  235.  
  236.     for (var x = 1; x < gMaxCon; ++x) {
  237.       gConnections[x].type = 'transfer';
  238.     }
  239.  
  240.     $('page-proxy-favicon').src = (gWebHost ? gWebHost : "http://" + gFtp.host) + "/favicon.ico";
  241.   },
  242.  
  243.   onWelcomed : function() {
  244.     displayWelcomeMessage(gFtp.welcomeMessage);
  245.   },
  246.  
  247.   onLoginAccepted : function(newHost) {
  248.     if (gFtp.isConnected && newHost) {                                      // switching to a different host or different login
  249.       remoteTree.treebox.rowCountChanged(0,    -remoteTree.rowCount);
  250.       remoteTree.rowCount    = 0;
  251.       remoteTree.data        = new Array();
  252.       remoteDirTree.treebox.rowCountChanged(0, -remoteDirTree.rowCount);
  253.       remoteDirTree.rowCount = 0;
  254.       remoteDirTree.data     = new Array();
  255.     }
  256.   },
  257.  
  258.   onLoginDenied : function() {
  259.     connect(false, true);
  260.   },
  261.  
  262.   onDisconnected : function(attemptingReconnect) {
  263.     try {
  264.       if (connectedButtonsDisabler) {                                       // connectedButtonsDisabler could be gone b/c we're disposing
  265.         connectedButtonsDisabler();
  266.         setConnectButton(true);
  267.         remoteDirTree.extraCallback = null;
  268.         remoteTree.extraCallback    = null;
  269.         remoteTree.errorCallback    = null;
  270.         this.extraCallback          = null;
  271.         gTreeSyncManager            = false;
  272.         remoteTree.pasteFiles       = new Array();
  273.         document.title              = "FireFTP";
  274.         $('remotePasteContext').setAttribute("disabled", true);
  275.         $('remotepath').removeAttribute("security");
  276.         securityPopup();
  277.  
  278.         if (gFxp && gFxp.isConnected) {
  279.           gFxp.disconnect();
  280.         }
  281.  
  282.         $('page-proxy-deck').selectedIndex = 0;
  283.         $('page-proxy-favicon').src = "";
  284.  
  285.         if (!attemptingReconnect) {
  286.           for (var x = 0; x < gTempEditFiles.length; ++x) {
  287.             gFireFTPUtils.removeFile(gTempEditFiles[x].file);
  288.             clearInterval(gTempEditFiles[x].id);
  289.           }
  290.  
  291.           gTempEditFiles = [];
  292.         }
  293.       }
  294.     } catch (ex) { }
  295.   },
  296.  
  297.   onReconnecting : function() {
  298.     $('abortbutton').disabled = false;
  299.   },
  300.  
  301.   onAbort : function() {
  302.     remoteDirTree.extraCallback = null;
  303.     remoteTree.extraCallback    = null;
  304.     remoteTree.errorCallback    = null;
  305.     this.extraCallback          = null;
  306.     gTreeSyncManager            = false;
  307.  
  308.     if (!gSearchRunning) {
  309.       localTree.refresh();
  310.       remoteTree.refresh();
  311.     }
  312.  
  313.     if (gFxp && gFxp.isConnected) {
  314.       gFxp.disconnect();
  315.     }
  316.   },
  317.  
  318.   onError : function(msg) {
  319.     error(msg, false, true);
  320.  
  321.     remoteDirTree.extraCallback = null;
  322.     remoteTree.extraCallback    = null;
  323.     this.extraCallback          = null;
  324.  
  325.     if (remoteTree.errorCallback) {
  326.       var tempCallback          = remoteTree.errorCallback;
  327.       remoteTree.errorCallback  = null;
  328.       tempCallback();
  329.     }
  330.  
  331.     if (gFxp && gFxp.isConnected) {
  332.       gFxp.disconnect();
  333.     }
  334.   },
  335.  
  336.   onDebug : function(msg, level) {
  337.     debug(msg, level, true);
  338.   },
  339.  
  340.   onAppendLog : function(msg, css, type) {
  341.     appendLog(msg, css, type, true);
  342.   },
  343.  
  344.   onIsReadyChange : function(state) {
  345.     try {
  346.       window.onbeforeunload = state ? null : beforeUnload;
  347.  
  348.       if (gLoadUrl && state && gFtp.isConnected && !gFtp.eventQueue.length) { // if it's an external link check to see if it's a file to download
  349.         var leafName = gLoadUrl.substring(gLoadUrl.lastIndexOf('/') + 1);
  350.         var index = -1;
  351.  
  352.         for (var x = 0; x < gFtp.listData.length; ++x) {
  353.           if (leafName == gFtp.listData[x].leafName) {
  354.             index = x;
  355.             break;
  356.           }
  357.         }
  358.  
  359.         var loadUrl = gLoadUrl;
  360.         gLoadUrl    = "";
  361.  
  362.         if (index == -1) {
  363.           appendLog(gStrbundle.getString("remoteNoExist"), 'error', "error");
  364.           return;
  365.         }
  366.  
  367.         if (gFtp.listData[index].isDirectory()) {
  368.           remoteDirTree.changeDir(loadUrl);
  369.         } else {                                                              // if it is, well, then download it
  370.           var prefBranch = gPrefsService.getBranch("browser.");
  371.  
  372.           try {
  373.             if (!prefBranch.getBoolPref("download.useDownloadDir")) {
  374.               if (!browseLocal(gStrbundle.getString("saveFileIn"))) {
  375.                 return;
  376.               }
  377.             }
  378.           } catch (ex) { }
  379.  
  380.           remoteTree.selection.select(index);
  381.           new transfer().start(true);
  382.         }
  383.       }
  384.     } catch (ex) { }
  385.   },
  386.  
  387.   onShouldRefresh : function(local, remote, dir) {
  388.     for (var x = 0; x < gMaxCon; ++x) {
  389.       if (!gConnections[x].isConnected) {
  390.         continue;
  391.       }
  392.  
  393.       if (gConnections[x].eventQueue.length && gConnections[x].eventQueue[0].cmd != "welcome") {
  394.         if (local) {
  395.           gConnections[x].localRefreshLater = dir;
  396.         }
  397.  
  398.         if (remote) {
  399.           gConnections[x].remoteRefreshLater = dir;
  400.         }
  401.         return;
  402.       }
  403.     }
  404.  
  405.     if (gRefreshMode && local) {
  406.       if (this.extraCallback) {
  407.         var tempCallback   = this.extraCallback;
  408.         this.extraCallback = null;
  409.         tempCallback();
  410.       } else {
  411.         if (gLocalPath.value != dir) {
  412.           localDirTree.addDirtyList(dir);
  413.         } else {
  414.           localTree.refresh();
  415.         }
  416.       }
  417.     }
  418.  
  419.     if (gRefreshMode && remote) {
  420.       if (this.extraCallback) {
  421.         var tempCallback   = this.extraCallback;
  422.         this.extraCallback = null;
  423.         tempCallback();
  424.       } else {
  425.         if (gRemotePath.value != dir) {
  426.           remoteDirTree.addDirtyList(dir);
  427.         } else {
  428.           remoteTree.refresh();
  429.         }
  430.       }
  431.     }
  432.   },
  433.  
  434.   onChangeDir : function(path, dontUpdateView, skipRecursion) {
  435.     if (!dontUpdateView) {
  436.       if (skipRecursion) {
  437.         gRemotePath.value = path ? path : gRemotePath.value;
  438.         remoteDirTree.dontPanic();                                          // don't forget to bring a towel
  439.       } else {
  440.         remoteDirTree.changeDir(path ? path : gRemotePath.value);
  441.       }
  442.     }
  443.   },
  444.  
  445.   onDirNotFound : function(buffer) {                                        // so this isn't exactly the cleanest way to do it, bite me
  446.     var changeDirPath;
  447.  
  448.     if (gFtp.eventQueue.length > 1 && gFtp.eventQueue[1].cmd == "LIST" && (typeof gFtp.eventQueue[1].callback == "string")
  449.                                                                        && gFtp.eventQueue[1].callback.indexOf("remoteDirTree.changeDir(") != -1) {
  450.       changeDirPath = gFtp.eventQueue[1].callback.substring(gFtp.eventQueue[1].callback.indexOf("'") + 1, gFtp.eventQueue[1].callback.length - 2);
  451.     }
  452.  
  453.     if (gFtp.eventQueue.length > 1 && gFtp.eventQueue[1].cmd == "LIST") {
  454.       gFtp.eventQueue.shift();                                              // get rid of pasv and list in the queue
  455.       gFtp.eventQueue.shift();
  456.       gFtp.trashQueue = new Array();
  457.     }
  458.  
  459.     if (changeDirPath) {                                                    // this is a fix for people who can't access '/' on their remote hosts
  460.       gRemotePath.value = changeDirPath;
  461.       remoteDirTree.dontPanic();                                            // don't forget to bring a towel
  462.     }
  463.   },
  464.  
  465.   onTransferFail : function(params, reason) {
  466.     queueTree.addFailed(params, reason);
  467.   },
  468.  
  469.   onSftpCache : function(buffer) {
  470.     var key = buffer.indexOf("\r\n") != -1 ? buffer.split("\r\n") : buffer.split("\n");
  471.     var index = 4;
  472.  
  473.     for (var x = 0; x < key.length; ++x) {
  474.       if (key[x].indexOf('is:') != -1) {
  475.         index = x + 1;
  476.         break;
  477.       }
  478.     }
  479.  
  480.     key = key[index];
  481.  
  482.     var flags    = gPromptService.BUTTON_TITLE_YES    * gPromptService.BUTTON_POS_0 +
  483.                    gPromptService.BUTTON_TITLE_NO     * gPromptService.BUTTON_POS_2 +
  484.                    gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1;
  485.     var response = gPromptService.confirmEx(window, gStrbundle.getString("sftpCacheTitle"),
  486.                                                     gStrbundle.getFormattedString("sftpCache", [key]), flags,
  487.                                                     null, null, null, null, {});
  488.     return response == 0 ? 'y' : (response == 2 ? 'n' : '');
  489.   }
  490. };
  491.  
  492. function transferObserver(connNo) {
  493.   this.connNo = connNo;
  494. }
  495.  
  496. transferObserver.prototype = {
  497.   securityCallbacks   : null,
  498.  
  499.   transferQueue       : function() {
  500.     var foundTransfer = false;
  501.  
  502.     for (var x = 0; x < gConnections[this.connNo - 1].eventQueue.length; ++x) {
  503.       if (foundTransfer || gConnections[this.connNo - 1].eventQueue[x].cmd == "transferBegin") {
  504.         foundTransfer = true;
  505.         gFtp.eventQueue.push(gConnections[this.connNo - 1].eventQueue[x]);
  506.       }
  507.     }
  508.   },
  509.  
  510.   onConnectionRefused : function()                   {
  511.     this.transferQueue();
  512.   },
  513.   onWelcomed          : function()                   { },
  514.   onConnected         : function()                   { },
  515.   onLoginAccepted     : function(newHost)            { },
  516.   onLoginDenied       : function()                   {
  517.     this.transferQueue();
  518.   },
  519.   onDisconnected      : function()                   { },
  520.   onReconnecting      : function()                   { },
  521.   onAbort             : function()                   { },
  522.   onError             : function(msg)                { error("[" + this.connNo + "] " + msg, false, true); },
  523.   onDebug             : function(msg, level)         { debug("[" + this.connNo + "] " + msg, level, true); },
  524.   onAppendLog         : function(msg, css, type)     { appendLog((gDebugMode ? "[" + this.connNo + "] " : "") + msg, css, type, true); },
  525.   onShouldRefresh     : function(local, remote, dir) { ftpObserver.onShouldRefresh(local, remote, dir); },
  526.   onDirNotFound       : function(buffer)             { },
  527.   onChangeDir         : function(path, dontUpdateView, skipRecursion) { },
  528.   onIsReadyChange     : function(state)              { },
  529.   onTransferFail      : function(params, reason) {
  530.     queueTree.addFailed(params, reason);
  531.   },
  532.  
  533.   onSftpCache : function(buffer) {
  534.     return 'n';
  535.   }
  536. };
  537.  
  538. function isReady() {
  539.   for (var x = 0; x < gMaxCon; ++x) {
  540.     if (!gConnections[x].isConnected) {
  541.       continue;
  542.     }
  543.  
  544.     if (!gConnections[x].isReady) {
  545.       return false;
  546.     }
  547.   }
  548.  
  549.   return true;
  550. }
  551.